/*
 * properties.cpp
 *
 *  Created on: 03/11/2012
 *      Author: leonardo
 *     version: 1.0
 */

#include "properties.h"

//Constructor por defecto
Properties::Properties() {}

//Destructor
Properties::~Properties() {
	properties.clear(); //elimino todos los elementos del mapa
}

//Constructor parametrizado para char *
Properties::Properties(const char * fileName) {
	string linea;

	configFile.open(fileName);

	if(configFile.is_open()) {
		while(!configFile.eof()){
			getline(configFile,linea);

			//Cargo las properties
			if(!isComment(linea))
				properties.insert(this->split(linea,"="));
		}
	}else
		cout << "Error al abrir archivo properties: " << fileName << endl;
}


//Constructor parametrizado para string
Properties::Properties(const string & fileName) {
	string linea;

	configFile.open(fileName.c_str());

	if(configFile.is_open()) {
		while(!configFile.eof()){
			getline(configFile,linea);

			//Cargo las properties
			if(!isComment(linea))
				properties.insert(this->split(linea,"="));
		}
	}else
		cout << "Error al abrir archivo properties: " << fileName << endl;
}


////////////Metodos publicos

//Carga las configuraciones desde el archivo
bool Properties::load(const char *fileName) {
	string linea;

	configFile.open(fileName);

	if(configFile.is_open()) {
		while(!configFile.eof()){
			getline(configFile,linea);

			//Cargo las properties
			if(!isComment(linea))
				properties.insert(this->split(linea,"="));
		}
		return true;
	}else
		return false;
}

//Carga las configuraciones desde el archivo
bool Properties::load(const string &fileName) {
	string linea;

	configFile.open(fileName.c_str());

	if(configFile.is_open()) {
		while(!configFile.eof()){
			getline(configFile,linea);

			//Cargo las properties
			if(!isComment(linea))
				properties.insert(this->split(linea,"="));
		}
		return true;
	}else
		return false;
}


//Obtiene la property indicada en el parámetro key
string Properties::getProperty(const string &key) {
	map<string, string>::iterator iter;

	iter = properties.find(key);

	if(iter != properties.end())
		return (*iter).second;

	return "";
}


//Obtiene la property indicada en el parámetro key
//Si no existe devuelve el valor por defecto indicado
string Properties::getProperty(const string &key, const string &defaultValue) {
	map<string, string>::iterator iter;

	iter = properties.find(key);

	if(iter != properties.end())
		return (*iter).second;

	return defaultValue;
}




/////Metodos privados

//Split de la linea del archivo properties
pair<string, string> Properties::split(const string &str, const string &delimiter) {
	string key, value;
	key = str.substr(0,str.find(delimiter));
	value = str.substr(str.find(delimiter)+1,(str.length()-str.find(delimiter))-2);

	return pair<string,string>(key,value);
}

//Verifica si la linea es un comentario
bool Properties::isComment(const string &str) {
	return str.substr(0,1) == "#" ? true : false;
}
